home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
serien
/
purity
/
nr.32
/
forum
/
pascal-workshop-3
< prev
next >
Wrap
Text File
|
1995-04-23
|
12KB
|
429 lines
Andreas Mauß & Bernd Künnen
proudly presents
//////////////////////////////////////
// //
// PCQ-Pascal Workshop - Teil 3 //
// //
// --- DOS --- //
// //
//////////////////////////////////////
Hi, zum dritten Teil des Pascal-Workshops! Bernd und ich haben uns end
lich aufgerafft, den dritten Teil des heißbegehrten Workshops zu machen.
Im heutigen Teil beschäftigen wir uns mit der Include-Datei "Dos".
So, nun gleich wieder ran !!!!!!!
program dos1;
{$I "Include:libraries/dos.i" }
var
r,w : Integer;
hdl : FileHandle;
buf : Array[0..80] of Char;
begin
hdl := DosOutput;
If hdl <> NIL then begin
w := DosWrite( hdl, "Eingabe : ", 10);
r := DosRead( hdl, Adr(buf), 80 );
w := DosWrite( hdl, "Ihre Eingabe war ", 17 );
buf[r+1] := chr(10);
w := DosWrite( hdl, Adr(buf), r+1 );
end;
end.
Am Anfang öffnen wir die Include-Datei `Dos.i`. Wir legen 2 Integervaria
blen, eine FileHandle und eine ARRAY [0..80] of CHAR fest. Auf die Filehand
levariable(hdl) legen wir den Zeiger von DosOutput fest. Danach fragen wir
`hdl` ab, ob sie größer oder kleiner(ob sie mit einem Zeiger oder einem
Wert) als NIL(0) ist. Wenn dem nicht so ist, springt das Programm zu Begin
wieder zurück. Auf die Variable `w` legen wir die Funktion `DosWrite`. Mit
DosWrite schreibt man einen Text ins Shell/CLI-Fenster. Der Text `Eingabe`
erscheint im Fenster, und wartet auf eine Eingabe (mit Dosread) des Users.
Die 10, in der Procedure bei Dosread, bedeutet das 10 Zeichen reserviert
sind. Diese Zeichen müßen mit der Ein- bzw. Augabe immer übereinstimmen.
Die Zeile `buf[r+1] := chr(10)` bedeutet das buf mit einem Null Byte enden
muß.
Mit w := DosWrite( hdl, Adr(buf), r+1 ); wird dann die Eingabe (ADR(buf))
ausgegeben.
program dos2;
{$I "Include:libraries/dos.i" }
var
w : Integer;
hdl : FileHandle;
begin
hdl := DosOpen( "s:startup-sequence", Mode_OldFile);
If hdl <> NIL then begin
Writeln("startup-sequence zum Lesen geöffnet.");
DosClose( hdl );
Writeln("...und wieder geschlossen.");
end else begin
Writeln("Konnte startup-sequence nicht öffnen!");
end;
end.
Im zweiten Beispiel öffnen wir mit DosOpen, die im s-Verzeichnis liegende
startup-sequence. Mode OldFile bedeutet das es ein exestierender Text sein
muß, der geöffnet werden soll. Ist die Variable `hdl` mit einem Wert belegt,
wird der Text "startup-sequence zum Lesen geöffnet" ausgegeben. Mit `Dosclo
se (hdl)` schließen wir wieder die startup-sequence, und geben den Text `...
und wieder geschlossen.`. IST hdl = NIL verzweigt die IF-Then-Else Anweisung
zu `end else begin` und gibt mit WriteLn den Text `Konnte startup-sequence
nicht öffnen!` aus.
program dos3;
{$I "Include:libraries/dos.i" }
var
w : Integer;
hdl : FileHandle;
begin
hdl := DosOpen( "CON:0/10/600/190/InfoX", Mode_NewFile);
If hdl <> NIL then begin
w := DosWrite( hdl, "\n CON-Fenster als *Datei*\n\n (4 sec.)\n", 38);
Delay(200); { * 4 sec. warten * }
DosClose( hdl );
end;
end.
Mit DosOpen wird ein neues CLI-Fenster geöffnet. Diesmal steht am Ende `Mode
NewFile` das eine neue Datei erstellt/öffnet. Mit DosWrite öffnen wir ein
CLI-Fenster mit den Angaben aus der hdl-Variable(DosOpen). Mit Delay warten
wir 4 Sekunden, bis dann DosClose das Fenster wieder schließt.
program dos4;
{$I "Include:libraries/dos.i" }
var
hdl : FileHandle;
begin
hdl := DosInput;
If IsInteractive( hdl ) then
writeln("Standardeingabe ist interaktiv, also ein Fenster.")
else
begin
writeln("Std.eingabe ist nicht interaktiv, also wahrsch.");
writeln("eine Datei per Redirektion: dos9 >ram:datei ");
end;
end.
Die Filehandle-Variable zeigt in diesem Beispiel auf DosInput. Mit der Pro
cedure IsInteractive überprüfen wie ob `hdl` interaktiv ist, also ob es ein
Fenster oder eine Datei ist!
Die If-Then-Else Anweisung weißt dann auf die entsprechende Zeile und gibt
dann den Text aus.
program dos5;
{$I "Include:libraries/dos.i" }
Const
name : String = "startup-sequence";
var
w : Integer;
oldlock,
newlock : FileLock;
hdl : FileHandle;
begin
hdl := DosOpen( name, Mode_OldFile );
If hdl = NIL then
writeln("Im aktuellen Directory keine Datei namens ", name)
else
begin
writeln("Uuups, sind wir tatsächlich schon in s: ?");
DosClose(hdl);
end;
newlock := Lock( "s:", Shared_Lock );
IF newlock = NIL then
writeln("Kann s: nicht finden.")
Else
Begin
oldlock := CurrentDir( newlock );
writeln("Bin jetzt im directory s: ...");
hdl := DosOpen( name, Mode_OldFile );
If hdl = NIL
then
writeln("Auch in s: keine ", name, " ? Seltsam.")
else
begin
writeln("Da ist ja die ", name );
DosClose(hdl);
end;
newlock := CurrentDir( oldlock );
If newlock <> NIL then UnLock(newlock);
End;
end.
Wir belegen mit der Konstante `name` den String "startup-sequence". Danach
versuchen wir mit DosOpen die startup-sequence zu öffnen, und fragen danach
wieder ab, ob die Variable `hdl` einen Wert hat. Findet das Programm die
`startup-sequence` nicht, wird der Text "Im aktuellen Directory keine Datei
namens startup-sequence` im Fenster aus. Findet das Programm allerdings die
startup-sequence wird der Text nach else begin ausgegeben, und die startup-
sequence wird wieder geschlossen.
Mit newlock := Lock( "s:", Shared_Lock ); suchen wir das s-Verzeichnis. Fin
det das Programm das s-Verzeichnis nicht, wird der Text `kann s nicht finden
ausgegeben. Hat newlock einen Wert, wechseln wir mit CurrentDir(NewLock) ins
s-Verzeichnis, und geben den Text `Bin jetzt im directory s: ...` aus.
Danach versucht das Programm wieder die Startup-Sequence zu öffnen, und gibt
den jeweiligen Text aus, ob die Datei geöffnet worden ist, oder nicht. Dan
ach schließt das Programm wieder die startup-sequence(sofern sie geöffnet
worden ist) und wechselt wieder ins alte Verzeichnis. Danach löschen wir
noch den Wert der newlock-Variable
program dos6;
{$I "Include:libraries/dos.i" }
Const
offset = 102;
dateiname = "devs:system-configuration";
var
pos,
w,z : Integer;
hdl : FileHandle;
begin
hdl := DosOpen( dateiname, Mode_OldFile);
If hdl <> NIL then begin
Writeln(" Datei zum Lesen geöffnet.");
pos := Seek( hdl, offset, Offset_Beginning );
WriteLn(" Datei : ", dateiname );
WriteLn(" offset : ", offset );
WriteLn(" alte Pos. : ", pos );
pos := Seek( hdl, 0, Offset_Current );
WriteLn(" akt. Pos. : ", pos );
Write (" Integer bei Offset", pos, " : ");
w := DosRead( hdl, Adr( z ), 4 );
If w<>4 then
WriteLn("\nKonnte die 4 Bytes nicht lesen.")
Else
WriteLn( z );
DosClose( hdl );
Writeln("\n\n...und wieder geschlossen.");
end else begin
Writeln("Konnte system-configuration nicht öffnen!");
end;
end.
Die offset Konstante belegen wir mit dem Wert 102 und dateiname mit
`devs:system-configuration`. Wir versuchen die Variable `dateiname` zu
öffnen, und fragen danach wieder ab, ob es geglückt ist. Mit Seek positio
nieren wir einen 'Dateizeiger', der die aktuelle Position in der datei
verwaltet. Mit WriteLn geben wir die Daten/Werte(dateiname,offset,pos) aus.
Jetzt gibt das Programm mit WriteLn die aktuelle Position aus. Mit Dosread
wird der Wert dann eingelesen und es wird abgefragt, ob der Wert größer oder
kleiner als 4 ist und gibt den Text `konnte die 4 Bytes nicht lesen` aus.
Ist der Wert(z) gleich 4, wird der Wert(z) ausgegeben, und die Datei system-
configuration wird geschloßen. Wurde die Datei system-configuration erst
garnicht gefunden, verweißt das Programm auf end else begin, und der Text
`Konnte system-configuration nicht öffnen` wird ausgegeben.
program dos7;
{$I "Include:libraries/dos.i" }
var
w,z : Integer;
buf : Array[0..99] of Char;
name : String;
begin
name := Adr(buf);
Write("Welche Datei soll gelöscht werden ? ");
Readln( name );
z:=-1;
repeat
Inc(z);
if name[z] = chr(10) { Muß mit Nullbyte enden }
then name[z] := chr(0); { Also Return zu Null }
until name[z] = chr(0);
If DeleteFile( name ) Then
writeln("Datei '", name, "' gelöscht.")
else
writeln("Konnte Datei '", name, "' nicht löschen.");
end.
Mit unserem nächsten Programm können wir Dateien löschen, also VORSICHT mit
diesem Programm.
Mit der String Variablen `name` können wir 100 Zeichen aufnehmen. Mit
ReadLn(name) lesen wir die Datei ein, die gelöscht werden soll. Mit der
Repeat-Anweisung muß die `name` Variable mit einem Null-Byte enden. Danach
löschen wir mit DeletFile(name) die Datei, und geben den Text aus. Wurde die
Datei nicht gefunden, oder irgendetwas ging schief, passiert nichts, und der
Text `Konnte Datei "name"nicht löschen.` ausgegeben.
program dos8;
{$I "Include:libraries/dos.i" }
{$I "Include:utils/stringlib.i" }
{$I "Include:utils/parameters.i" }
var
ret : Integer;
buf : Array[0..99] of Char;
parm : String;
begin
parm := Adr(buf);
GetParam( 1, parm );
If strlen( parm )=0 then begin
writeln("dos8, gibt einen returncode zurück.");
writeln(" Aufruf : dos7 [5|10|15|15]");
DosExit(0);
End;
ret := 0;
If strcmp( parm, "5")=0 then ret := 5;
If strcmp( parm, "10")=0 then ret := 10;
If strcmp( parm, "15")=0 then ret := 15;
If strcmp( parm, "20")=0 then ret := 20;
Writeln("dos8 gibt ", ret, " ans CLI zurück.");
DosExit( ret );
end.
Die Stringvariable `parm` hat wieder einen Puffer von 100 Zeichen. Mit Get
Param können wir einen Parameter/Wert aufnehmen. In der If-End Anweisung
wird erforscht, ob `parm` einen Wert besitzt. Wenn `parm` keinen Parameter
besitzt, werden die beiden WriteLn-Zeilen ausgegeben. Besitzt `parm` einen
Wert, wird dieser, an eine Integervariable übergeben und ein Text mit
dem Ergebnis ausgegeben. Der Aufruf des Programms muß einen Parameter haben!
Z.B. "Dos8 10".
program dos9;
{$I "Include:libraries/dos.i" }
{$I "Include:utils/stringlib.i" }
{$I "Include:utils/parameters.i" }
var
buf1,
buf2 : Array[0..99] of Char;
parm1,
parm2 : String;
begin
parm1 := Adr(buf1);
parm2 := Adr(buf2);
GetParam( 1, parm1 );
GetParam( 2, parm2 );
If ( buf1[0] = chr(0) )
Or ( buf2[0] = chr(0) )
then
begin
writeln("Aufruf: dos10 dateiname Kommantar");
DosExit(0);
end;
If SetComment( parm1, parm2)
then
writeln("Kommentar erfolgreich gesetzt.")
else
writeln("Konnte Kommentar zur Datei '",
parm1,
"' nicht setzen!");
end.
Zwei Stringvariablen mit einem Puffer (mal wieder) von 100 Zeichen werden
deklariert. Es wird abgefragt ob `parm1&2` Werte haben. Haben die Va
riablen einen WERT, wird ein Kommentar gesetzt, der am Anfang des Aufrufes
eingegeben werden muß. Z.B. `Dos9 dir Directoryausgabe`. Danach wird noch
überprüft, ob der Kommentar erfolgreich übersetzt wurde.
So, das war schon wieder der Pascal-Worshop mit `DOS`! In näherer Zukunft
werden Bernd und ich, einen weiteren Pascal-Workshop machen, der sich mit
Intution beschäftigt!
Bis dann......